<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Post;
use App\Models\Category;
use App\Models\Tag;
use App\Models\User;
use Illuminate\Support\Str;
use Carbon\Carbon;

class PostSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // 获取用户和分类
        $user = User::first();
        $categories = Category::all();
        $tags = Tag::all();

        if (!$user) {
            $this->command->error('请先创建用户数据');
            return;
        }

        $posts = [
            [
                'title' => 'Laravel 11 新特性详解',
                'slug' => 'laravel-11-new-features',
                'excerpt' => 'Laravel 11 带来了许多令人兴奋的新特性，包括改进的性能、新的语法糖和更好的开发体验。',
                'content' => '<h2>Laravel 11 主要新特性</h2>\n<p>Laravel 11 是一个重要的版本更新，带来了许多令人兴奋的新特性和改进。</p>\n\n<h3>1. 性能优化</h3>\n<p>Laravel 11 在性能方面有了显著的提升，特别是在路由解析和数据库查询优化方面。</p>\n\n<h3>2. 新的语法特性</h3>\n<p>引入了更多的语法糖，让代码更加简洁和易读。</p>\n\n<h3>3. 改进的开发体验</h3>\n<p>新版本提供了更好的错误提示和调试工具，大大提升了开发效率。</p>\n\n<h3>4. 安全性增强</h3>\n<p>加强了安全防护机制，提供了更多的安全配置选项。</p>',
                'status' => 'published',
                'published_at' => Carbon::now()->subDays(5),
                'category_id' => $categories->where('slug', 'php')->first()?->id ?? $categories->first()->id,
                'user_id' => $user->id,
                'tags' => ['laravel', 'php', 'backend'],
            ],
            [
                'title' => 'Vue.js 3 组合式API实战指南',
                'slug' => 'vuejs-3-composition-api-guide',
                'excerpt' => '深入了解Vue.js 3的组合式API，学习如何使用新的语法来构建更加灵活和可维护的前端应用。',
                'content' => '<h2>Vue.js 3 组合式API</h2>\n<p>Vue.js 3 引入了组合式API，这是一个全新的编程范式，让我们能够更好地组织和复用代码。</p>\n\n<h3>什么是组合式API？</h3>\n<p>组合式API是一套基于函数的API，允许我们更灵活地组织组件逻辑。</p>\n\n<h3>基本用法</h3>\n<pre><code>import { ref, computed } from \'vue\'\n\nexport default {\n  setup() {\n    const count = ref(0)\n    const doubleCount = computed(() => count.value * 2)\n    \n    return {\n      count,\n      doubleCount\n    }\n  }\n}</code></pre>\n\n<h3>优势</h3>\n<ul>\n<li>更好的类型推导</li>\n<li>更灵活的逻辑复用</li>\n<li>更好的代码组织</li>\n</ul>',
                'status' => 'published',
                'published_at' => Carbon::now()->subDays(3),
                'category_id' => $categories->where('slug', 'javascript')->first()?->id ?? $categories->first()->id,
                'user_id' => $user->id,
                'tags' => ['vuejs', 'javascript', 'frontend'],
            ],
            [
                'title' => 'MySQL性能优化最佳实践',
                'slug' => 'mysql-performance-optimization',
                'excerpt' => '分享MySQL数据库性能优化的实用技巧和最佳实践，帮助你提升数据库查询效率。',
                'content' => '<h2>MySQL性能优化指南</h2>\n<p>数据库性能优化是每个开发者都需要掌握的重要技能。</p>\n\n<h3>1. 索引优化</h3>\n<p>合理使用索引是提升查询性能的关键。</p>\n<ul>\n<li>为经常查询的字段创建索引</li>\n<li>避免过多的索引</li>\n<li>使用复合索引</li>\n</ul>\n\n<h3>2. 查询优化</h3>\n<p>编写高效的SQL查询语句：</p>\n<ul>\n<li>避免SELECT *</li>\n<li>使用LIMIT限制结果集</li>\n<li>合理使用JOIN</li>\n</ul>\n\n<h3>3. 配置优化</h3>\n<p>调整MySQL配置参数以获得最佳性能。</p>',
                'status' => 'published',
                'published_at' => Carbon::now()->subDays(1),
                'category_id' => $categories->where('slug', 'database')->first()?->id ?? $categories->first()->id,
                'user_id' => $user->id,
                'tags' => ['mysql', 'database-design', 'performance'],
            ],
            [
                'title' => 'Docker容器化部署实战',
                'slug' => 'docker-deployment-practice',
                'excerpt' => '学习如何使用Docker进行应用容器化部署，提升开发和运维效率。',
                'content' => '<h2>Docker容器化部署</h2>\n<p>Docker是现代应用部署的重要工具，让我们来学习如何使用它。</p>\n\n<h3>什么是Docker？</h3>\n<p>Docker是一个开源的容器化平台，可以将应用及其依赖打包成轻量级的容器。</p>\n\n<h3>基本概念</h3>\n<ul>\n<li>镜像（Image）</li>\n<li>容器（Container）</li>\n<li>仓库（Repository）</li>\n</ul>\n\n<h3>实战示例</h3>\n<pre><code># Dockerfile\nFROM php:8.2-fpm\n\nWORKDIR /var/www\n\nCOPY . .\n\nRUN composer install\n\nEXPOSE 9000</code></pre>',
                'status' => 'draft',
                'published_at' => null,
                'category_id' => $categories->where('slug', 'tech')->first()?->id ?? $categories->first()->id,
                'user_id' => $user->id,
                'tags' => ['docker', 'backend', 'performance'],
            ],
            [
                'title' => '我的编程学习心得',
                'slug' => 'my-programming-learning-experience',
                'excerpt' => '分享我在编程学习路上的一些心得体会和经验总结。',
                'content' => '<h2>编程学习之路</h2>\n<p>回顾我的编程学习历程，有很多值得分享的经验和感悟。</p>\n\n<h3>学习方法</h3>\n<p>好的学习方法能让我们事半功倍：</p>\n<ul>\n<li>理论与实践相结合</li>\n<li>多做项目练习</li>\n<li>参与开源项目</li>\n<li>保持持续学习</li>\n</ul>\n\n<h3>遇到的挑战</h3>\n<p>学习过程中难免会遇到各种挑战，重要的是如何克服它们。</p>\n\n<h3>给新手的建议</h3>\n<p>如果你刚开始学习编程，我建议你：</p>\n<ul>\n<li>选择一门语言深入学习</li>\n<li>多写代码，多练习</li>\n<li>不要害怕犯错</li>\n<li>加入技术社区</li>\n</ul>',
                'status' => 'published',
                'published_at' => Carbon::now()->subDays(7),
                'category_id' => $categories->where('slug', 'study')->first()?->id ?? $categories->first()->id,
                'user_id' => $user->id,
                'tags' => ['php', 'javascript'],
            ],
        ];

        foreach ($posts as $postData) {
            $tagSlugs = $postData['tags'];
            unset($postData['tags']);
            
            $post = Post::firstOrCreate(
                ['slug' => $postData['slug']],
                $postData
            );
            
            // 关联标签
            $postTags = $tags->whereIn('slug', $tagSlugs);
            $post->tags()->attach($postTags->pluck('id'));
        }
    }
}